﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _03_Process_进程通讯_2
{
    /// <summary>
    /// 进程通讯的结构体
    /// </summary>
    public struct COPYDATASTRUCT
    {
        public IntPtr dwData;//这个值是可以为任意数值，通常这个可以作为标志位存在
        public int cbData;//指定lpData指向的缓冲区的字节数
        [MarshalAs(UnmanagedType.LPStr)]//规定发送的数据类型为String字符串类型
        public string lpData;//发送的字符串
    }

    public partial class Form1 : Form
    {

        [DllImport("User32.dll")]
        private static extern int FindWindow(string ipClassName, string ipWindowName);

        //SendMessage函数是Windows用户界面组件的一部分，用于向指定的窗口发送消息。
        //int hWnd: 这是窗口的句柄（handle），它是一个指向特定窗口的指针。窗口句柄在Windows操作系统中用于标识一个打开的窗口。hWnd参数指定了要发送消息的目标窗口。
        //int msg: 这是消息的标识符，它是一个整数值，用于指定要发送的消息类型。Windows定义了一系列预定义的消息，如WM_PAINT（重绘窗口）、WM_COMMAND（菜单命令）、WM_DESTROY（销毁窗口）等。开发者也可以定义自定义消息。
        //int wParam: 这是一个附加的参数，其类型为整数。它的用途取决于消息的类型。有时它传递额外的信息，有时则用于传递标识符或标志。wParam的具体含义和用法需要参考发送的消息的文档说明。
        //ref COPYDATASTRUCT IParam: 这是一个引用参数，指向一个COPYDATASTRUCT结构的实例。COPYDATASTRUCT是一个用于在应用程序之间传递数据的结构体。它通常包含一个指向数据的指针和一个指定数据大小的整数值。IParam是这个结构体的实例名，而ref关键字表示这个参数是按引用传递的，这意味着在函数内部对它的修改会反映到原始数据结构中。
        [DllImport("User32.dll")]
        private static extern int SendMessage(int hWnd, int msg, int wParam, ref COPYDATASTRUCT IParam);

        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 发送
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //查找指定标题的句柄
            int hwnd = FindWindow(null, "数据接收方");
            if (hwnd == 0)
            {
                MessageBox.Show("未找到窗口");
                return;
            }
            else
            {
                //要发送的字符串内容
                string str = DateTime.Now.ToString();
                //将字符串转换为字节数组
                byte[] buffer = Encoding.Default.GetBytes(str);
                //获取字节数组的长度
                int length = buffer.Length;
                //构建用于进程通讯的结构体
                COPYDATASTRUCT cds;
                cds.dwData = (IntPtr)100;
                cds.lpData = str;//数据内容
                cds.cbData = length + 1;//数据长度
                //发送数据
                SendMessage(hwnd, 0x004A, 0, ref cds);
            }


        }
    }
}
